import base64
import pickle

from django_redis import get_redis_connection

'''
1. 合并方向
    在登陆后, 把cookie中的数据合并到redis中
2. 合并数据
    商品id 数量 和商品勾选状态
3. 合并方案
    3.1 redis中的数据保存
    3.2 如果cookie的数据在redis中已存在, 直接用cookie数据覆盖redis
    3.3 如果不存在, 则把cookie的数据新增到redis中
    3.3 最终购物车的勾选状态和商品数量以cookie中为准

代码步骤:
    1. 读取cookie
    2. 连接redis
    3. 初始化3个容器
        一个列表存放选中的id
        一个列表存放未选中的id
        一个字典保存cookie数据转换为hash的数据
    4. 对cookie数据进行遍历
        对数据判断
    5. 更新redis
    6. 删除cookie
'''


def move_cart_cookie_to_redis(request, response, user):
    # 在用户登录后将购物车数据从cookie合并到redis中
    # 1. 读取cookie
    cookie_cart_str = request.COOKIES.get('carts')
    # 对数据进行判断
    if cookie_cart_str:
        # 对cookie的数据解码
        cookie_cart_dict = pickle.loads(base64.b64decode(cookie_cart_str))

        # 2. 初始化3个容器
        #     一个列表存放选中的id
        new_cart_selected_add = []
        #     一个列表存放未选中的id
        new_cart_selected_rm = []
        #     一个字典保存cookie数据转换为hash的数据
        new_cart_dict = {}

        # 3. 对cookie数据进行遍历
        for sku_id, cart_dict in cookie_cart_dict.items():
            # 商品数量以cookie中数据为准
            new_cart_dict[sku_id] = cart_dict['count']

            # 商品勾选状态以cookie中数据为准
            if cart_dict['selected']:
                new_cart_selected_add.append(sku_id)
            else:
                new_cart_selected_rm.append(sku_id)

        # 4. 连接redis并更新redis
        redis_conn = get_redis_connection('carts')
        pl = redis_conn.pipeline()

        # 将新字典保存到redis中, 存在即覆盖, 不存在即新增
        # HMSET key [field value ...]  直接在hash中添加字典
        pl.hmset('carts_%s' % user.id, new_cart_dict)

        # 将勾选状态保存到redis中, 以cookie中的勾选状态为准
        if new_cart_selected_add:
            pl.sadd('selected_%s' % user.id, *new_cart_selected_add)
        if new_cart_selected_rm:
            pl.sadd('selected_%s' % user.id, *new_cart_selected_rm)
        pl.execute()

        # 5. 删除cookie
        response.delete_cookie('carts')
        return response
    return response